package cn.tedu.blog.server.mapper;

import cn.tedu.blog.server.pojo.dto.ArticleExamineNewDTO;
import cn.tedu.blog.server.pojo.entity.Article;
import cn.tedu.blog.server.pojo.vo.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;


@Repository
public interface ArticleMapper {
    /**
     * 根据标题查询文章
     * @param title
     * @return
     */
    ArticleDetailVO getByTitle(String title);

    /**
     * 添加文章
     * @param article
     * @return
     */
   
    int insert(Article article);


    /**
     * 审核文章，修改文章审核状态
     * @param articleExamineNewDTO
     * @return
     */
    int createExamineStatus(ArticleExamineNewDTO articleExamineNewDTO);



    /**
     * 根据id删除文章
     * @param id
     * @return
     */
    int deleteById(long id);
    /**
     * 根据多个id批量删除文章
     * @param ids
     * @return
     */
    int deleteByIds(Long[] ids);
    /**
     * 根据id修改文章
     * @param
     * @return
     */
    int updateById(Article article);


    /**
     * 修改文章点赞数据
     */
    int updatePrasieById(@Param("id")Long id,@Param("praiseCount")int praiseCount);

    /**
     * 修改文章阅读量
     */
    int updateViewCount(Long id);


    /**
     * 根据id查询文章
     * @param id
     * @return
     */
    ArticleDetailVO getById(long id);

    ArticleDetailVO adminSelect(Long id);


    List<ArticleAdminDetailVO> adminSelectFind(@Param("page") Page<Object> page, @Param("param") Map<String,Object> map);

    List<ArticleAdminDetailVO> adminSelectFindAll(ArticleAdminDetailVO articleAdminDetailVO);

    int deleteArticleTag(Long id);


    List<ArticleDetailVO> selectByIds(Long[] ids);

    int selectCount(ArticleAdminDetailVO articleAdminDetailVO);

    /* ------------------------------ */
    // 前台部分

    /**
     * 根据分类id查询文章列表, 分页查, 根据发布时间排序, 发布状态
     * @param categoryId
     * @return
     */
    List<ApiArticleListItemVO> listArticlesByCategoryId(Long categoryId);



    /**
     * 最新文章查询
     * @return
     */
    List<ArticleStandardVO> selectNewest();

    /**
     * 热门文章查询
     * @return
     */
    List<ArticleStandardVO> selectPopularArticle();

    /**
     * 管理员推介文章
     * @return
     */
    List<ArticleStandardVO> selectIsRecommendArticle();

    /**
     * 分页文章查询
     * @return
     */
    List<ArticleStandardVO> selectIsArticlePageList();
    /*查询文章的数量*/
    Long selectArticleCount();
    /*查询所有文章*/
    List<ArticleStandardVO> findAllList();
    /*文章发布数量统计*/
    Long articleCount();


    /**
     * 根据用户id获取该用户的文章数
     * @param userId 用户id
     * @return 该用户的文章数
     */
    Long articleCountByUserId(Long userId);

    /**
     * 根据用户id获得该用户的文章
     * @param userId 用户id
     * @return  用户文章列表
     */
    List<ArticlePersonalDetailVO> articlePersonalDetailByUserId(Long userId, int pagSize, int auditStatus);

    /**
     * 获取用户发表的文章数
     * @param userId    用户id
     * @return  用户发表的文章数
     */
    int countArticleByUserId(Long userId, int auditStatus);

    /*多表查询用户收藏文章*/

    /**
     * 多表查询用户收藏文章
     * @param userId 用户id
     * @return 用户收藏文章列表
     */
    List<FavoriteArticleVO> collectionArticleByUserId(Long userId, int pagSize);


    /*根据文章分类id查询文章数量*/
    Long countArticleByCategoryId(Long categoryId);


        /*根据id查询标签文章*/
    List<ApiArticleListItemVO> listArticlesByTagId(Long tagId);

    Long countArticleBytagId(Long tagId);



}
